package socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/*176.201.111.10
 *socket是Java中用于网络通信的类，
 * 它可以连接到指定的远程主机和端口，
 * 并通过输入输出流进行数据传输。
 * 这个变量可以在类的内部用于
 * 建立和管理与远程服务器的TCP连接。
 * */
public class Client {
    private Socket socket;
    //构造方法,初始化客户端
    public Client(){
        try {
            System.out.println("正在连接服务端");
//            socket = new Socket("176.201.111.6",8088);
            socket = new Socket("localhost",8088);
            System.out.println("与服务端连接成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    };
    //客户端开始工作的方法
    public void start(){
        try {
            OutputStream os=socket.getOutputStream();
            OutputStreamWriter osw=new OutputStreamWriter(os);
            BufferedWriter bw=new BufferedWriter(osw);
            PrintWriter pw=new PrintWriter(bw,true);
            //自动行刷新必须配合println使用


            Scanner scan=new Scanner(System.in);
            //要求输入用户名昵称
            while(true){
                System.out.println("请输入用户名：");
                String nickName = scan.nextLine();
                if(nickName.trim().length()>0){
                    pw.println(nickName);
                    break;
                }
                System.out.println("用户名不能为空");
            };
            //启动线程,接受服务端发送过来的消息
            SeverHandler handler=new SeverHandler();
            Thread t=new Thread(handler);
            t.setDaemon(true);//设置为守护线程
            t.start();

            while(true){
                System.out.println("请输入要发送的内容：");
                String line=scan.nextLine();
                if("exit".equals(line))
                    break;
                pw.println(line);


            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

    public static void main(String[] args) {
        Client client =new Client();
        client.start();
    }
    //该线程负责读取服务端发送过来的消息
    private  class SeverHandler implements Runnable {
        public void run(){
            try {
                InputStream is=socket.getInputStream();
                InputStreamReader isr=new InputStreamReader(is);
                BufferedReader br=new BufferedReader(isr);
                String message;
                while((message=br.readLine())!=null){
                    System.out.println(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
